#include <stdio.h>
#include "mxml.h"

/***
 *   car.xml 和 car2.xml 区别： 有空格和没有 
 *    car.xml 无法解析出来， 
 *    有换行的，用mxmlWalkNext 函数
 * 应该： 空格也是一个节点
 * 
 */

// <?xml version="1.0" encoding="utf-8"?>
// <car>
//    <factory name="一汽大众">
//       <brand><name>高尔夫</name>
//       <color>红色</color>
//       <price>15万</price>
//       </brand><brand>
//       <name>速腾</name>
//       <color>银白</color>
//       <price>18万</price>
//       </brand><brand>
//       <name>迈腾</name>
//       <color>黑灰</color>
//       <price>28万</price>
//       </brand></factory>
//    <factory name="上海大众">
//       <brand><name>帕萨特</name>
//       <color>黑色</color>
//       <price>25万</price>
//       </brand><brand>
//       <name>POLO</name>
//       <color>灰色</color>
//       <price>8万</price>
//       </brand></factory>
// </car>
int main(int argc, const char* argv[])
{
    if(argc < 2)
    {
        printf("./a.out filename\n");
        return 0;
    }
    // 加载xml文件
    FILE* fp = fopen(argv[1], "r");
    mxml_node_t* root = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK);  // MXML_NO_CALLBACK 没有回调 

    // root根结点，<?xml version="1.0" encoding="utf-8"?>  就是

    // 找到第一个factory节点
    // 当前节点， 根节点，找的节点， 节点属性，属性名 一直往下找，直到找到为止
    mxml_node_t* factory = mxmlFindElement(root, root, "factory", "name", NULL, MXML_DESCEND);
    // 循环查找
    while( factory  )
    {
        // 打印几点的属性值
        printf("factory attr: %s\n", mxmlElementGetAttr(factory, "name"));

        // 向下移动一个节点
        mxml_node_t* brand = mxmlWalkNext(factory, root, MXML_DESCEND);
          //有多个品牌
        while( brand ) 
        {
            // name
            mxml_node_t* node = mxmlWalkNext(brand, root, MXML_DESCEND_FIRST);
            printf("    name: %s\n", mxmlGetText(node, 0));
            // color
            node = mxmlWalkNext(node, root, MXML_NO_DESCEND);
            printf("    color: %s\n", mxmlGetText(node, 0));
            // price
            node = mxmlWalkNext(node, root, MXML_NO_DESCEND);
            printf("    price: %s\n", mxmlGetText(node, 0));
            printf("    =========================================\n");

            // 找到下一个品牌节点
            brand = mxmlFindElement(brand, root, "brand", NULL, NULL, MXML_NO_DESCEND);
        }
        // 打印该厂家对应的车辆品牌和属性信息
        // 查找下一个节点
        factory = mxmlFindElement(factory, root, "factory", "name", NULL, MXML_NO_DESCEND);
    }
    mxmlDelete(root);
    fclose(fp);

    return 0;
}
